package edu.fasta.sisinfo2.poker;

import java.util.*;

public class Mano{
	public List cartasMesa;
	public List cartasJugador;
	public List todasLasCartas;
	public List mejorMano;
	/**
	 * Crea una nueva mano
	 */
	public Mano() {
		this.setCartasJugador(new ArrayList());
		this.setCartasMesa(new ArrayList());
		this.setMejorMano(null);
		this.setTodasLasCartas(new ArrayList());
	}	
	/**
	 * Carga en un arreglo todas las cartas que ve el jugador.
	 * Incluye sus 2 cartas y las 5 de la mesa.
	 */
	public void cargarTodasLasCartas(){
		this.getTodasLasCartas().addAll(this.getCartasJugador());
		this.getTodasLasCartas().addAll(this.getCartasMesa());		
	}
	
	/**
	 * Borra la lista de las 7 cartas que ve el jugador.
	 */
	public void quitarTodasLasCartas(){
		this.getTodasLasCartas().removeAll(this.getTodasLasCartas());
	}
	
	
	/**
	 * Devuelve la lista combinatoria de todas las {@link Mano} posibles de 5 {@link Carta}.
	 * @return {@link List} manosPosibles
	 */
	public List combinatoria(){ 
		List mano = new ArrayList();
		List todas = new ArrayList();
		List manosPosibles = new ArrayList();
		this.cargarTodasLasCartas();
		todas = getTodasLasCartas();
		for (int i=0; i<3; i++){
			for (int j=i+1; j<4; j++){
				for (int k=j+1; k<5; k++){
					for (int l=k+1; l<6; l++){
						for (int m=l+1; m<7; m++){
							mano = new ArrayList();
							mano.add(0, todas.get(i));
							mano.add(1, todas.get(j));
							mano.add(2, todas.get(k));
							mano.add(3, todas.get(l));
							mano.add(4, todas.get(m));														
							ordenarCartas(mano);							
							manosPosibles.add(mano);
						}
					}
				}
			}
		}
		return manosPosibles;
	}		
	/**
	 * Recibe una lista de {@link Carta}s y la ordena.
	 * @param cartas
	 */
	public void ordenarCartas(List cartas){
		Carta aux;
		for(int i=0; i<4; i++) { 
			for (int j = i+1; j<5; j++) {
				if (((Carta) cartas.get(j)).getPuntaje()<=((Carta) cartas.get(i)).getPuntaje()){
					aux = (Carta) cartas.get(j);
					cartas.set(j, cartas.get(i));
					cartas.set(i, aux);
				}
			}
		}	
	}	


	/**Carga una {@link Carta} de la {@link MesaImplementacion} en la {@link Mano}.
	 * @param unaCarta Carta para agregar a la mesa.
	 */
	public void agregarCartaDeMesa(Carta unaCarta){
		this.getCartasMesa().add(unaCarta);
	}	
	/**Carga una {@link Carta} de {@link JugadorImplementacion} en la {@link Mano}.
	 * @param unaCarta Carta para agregar a la mano del jugador.
	 */
	public void agregarCartaDeJugador(Carta unaCarta){
		this.getCartasJugador().add(unaCarta);
	}
	/**
	 * @return String con las cartas de la mesa.
	 */
	public String getCartasMesaStr() {
		String salida = new String();
		Iterator it = getCartasMesa().iterator();
		while(it.hasNext()){
			salida = salida.concat( "\n " + ((Carta) it.next()).imprimirla());
		}		
		return salida;
	}		
	/**
	 * @return Devuelve las cartas del jugador
	 */
	public String getCartasJugadorStr() {
		String salida = new String();
		Iterator it = getCartasJugador().iterator();
		while(it.hasNext()){
			salida = salida.concat(((Carta) it.next()).imprimirla() + "\n");
		}		
		return salida;
	}
	/**
	 * Setea las cartas de la mesa.
	 * @param cartasMesa Cartas en la mesa.
	 */
	public void setCartasMesa(List cartasMesa) {
		this.cartasMesa = cartasMesa;
	}
	/**
	 * @return Devuelve las cartas del jugador.
	 */
	public List getCartasJugador() {
		return cartasJugador;
	}
	/**
	 * Setea las cartas del jugador.
	 * @param cartasJugador Cartas del jugador.
	 */
	public void setCartasJugador(List cartasJugador) {
		this.cartasJugador = cartasJugador;
	}
	/**
	 * @return Mejor mano de las cartas del jugador y la mesa
	 */
	public List getMejorMano() {
		return mejorMano;
	}
	/**
	 * @return Cartas de la mesa.
	 */
	public List getCartasMesa() {
		return cartasMesa;
	}
	/**
	 * Setea la mejor mano del jugador.
	 * @param mejorMano Nueva mejor mano.
	 */
	public void setMejorMano(List mejorMano) {
		this.mejorMano = mejorMano;
	}
	/**
	 * @return Todas las cartas (mesa + jugador)
	 */
	public List getTodasLasCartas() {
		return todasLasCartas;
	}
	/**
	 * Setea Todas las cartas (mesa + jugador)
	 * @param todasLasCartas Todas las cartas nuevas.
	 */
	public void setTodasLasCartas(List todasLasCartas) {
		this.todasLasCartas = todasLasCartas;
	}
}
